package com.stedu.mall.goodsservice.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.stedu.mall.common.bean.Category;
import com.stedu.mall.common.exception.SteduException;
import com.stedu.mall.common.service.CategoryService;
import com.stedu.mall.goodsservice.mapper.CategoryMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class CategoryServiceImpl implements CategoryService {
    @Autowired
    private CategoryMapper categoryMapper;
    @Override
    public boolean insert(Category category) throws SteduException {
        /**
         * 判断被添加分类的父分类是否存在
         * 1。根据被添加分类的parentId查询其父分类
         *      |-- 不存在 -- 抛出异常
         *      |-- 存在 --2
         * 2.判断这个“父分类”是否真的是父分类
         *      |-- 不是 -- 抛出异常
         *      |-- 是 -- 继续
         * **/
        if(!category.getParentId().equals(0)){
            Category parent = categoryMapper.selectById(category.getParentId());
            if(parent == null ||(parent != null && !parent.getParentId().equals(0))) {
                throw new SteduException("被添加分类的父分类不存在或不合法，无法添加");
            }
        }
        /**
         * 判断同一个父分类下是否有同名的子分类
         * 1.查询同一个父分类下所有的子分类
         * 2.判断是否重名
         * **/
        List<Category> categoryList = categoryMapper.selectByParentId(category.getParentId());
        boolean flag = categoryList.stream()
                .anyMatch(item -> item.getName().equals(category.getName()));
        if (flag){
            throw new SteduException("被添加分类的名字和同级别其他分类名字相同，不允许添加");
        }
        return categoryMapper.insert(category) == 1;
    }

    @Override
    public boolean delete(Integer id) throws SteduException {
        //判断被删除的分类是否存在
        Category category = categoryMapper.selectById(id);
        if (category == null){
            throw new SteduException("该分类不存在，无法删除");
        }
        //如果是父分类判断其下是否有子分类
        if (category.getParentId() .equals(0)  && category.getChildList().size()>0){
            throw new SteduException("该分类存在关联的子分类，无法删除");
        }
        //删除
        return categoryMapper.delete(id) == 1;
    }

    @Override
    public boolean update(Category category) throws SteduException {//category内容不全
        //父分类无法修改为下架
        if (category.getRecom() != null && categoryMapper.selectById(category.getId()).getParentId().equals(0)) {
            throw new SteduException("该分类为父分类，无法下架");
        }
        //0)查询被修改分类的详细信息 - 修改之前的详细信息
        Category oldInfo= categoryMapper.selectById(category.getId());
        Category newInfo = category;
        //1)判断被修改的分类是否存在
        if(oldInfo == null){
            throw new SteduException("该分类不存在，无法修改");
        }
        //2)如果父分类下存在了分类，那么这个父分类不能被修改为子分类
        if(oldInfo.getParentId() .equals(0) && oldInfo.getChildList().size()>0 && (newInfo.getParentId() != null && !newInfo.getParentId().equals(0))){
            throw new SteduException("该分类存在子分类，无法修改为子分类……");
        }
        //3)一个父分类不能把自己设置为自己的父分类
        if(oldInfo.getParentId().equals(0) &&!newInfo.getParentId().equals(0)&& newInfo.getParentId().equals(oldInfo.getId())){
            throw new SteduException("不能将自己设置为自己的父分类");
        }
        /**
        * 4)判断同一个父分类是否有同名的子分类 -- 重名
        *   1.查询同一个父分类下所有的子分类
         *   2.判断是否同名
        **/
        //获取修改之后的父分类id
        Integer parentId = newInfo.getParentId() == null ? oldInfo.getParentId() : newInfo.getParentId();
        //获取修改之后的名字
        String name = newInfo.getName() == null ? oldInfo.getName() : newInfo.getName();
        //查询修改之后同一个父分类下所有的子分类
        if (categoryMapper.selectByParentId(parentId)
                .stream()
                .anyMatch(item -> item.getName().equals(name) && item.getId() != category.getId())) {
            throw  new SteduException("修改之后的分类名和同级的其他分类名相同，不允许修改");
        }

        //修改
        return categoryMapper.update(category) == 1;
    }

    @Override
    public Object selectByCondition(Category condition, Integer pageNum, Integer pageSize) {
        if(pageNum == null){//不分页
            return categoryMapper.selectByCondition(condition);
        }else{//分页
            //设置分页参数
            PageHelper.startPage(pageNum, pageSize);
            //查询
            List<Category> categories = categoryMapper.selectByCondition(condition);
            //创建分页信息对象
            PageInfo<Category> pageInfo = new PageInfo<>(categories);

            return pageInfo;

        }
    }

    @Override
    public Category selectById(Integer id) {
        return categoryMapper.selectById(id);
    }
}
